/*
 * =====================================================================================
 *
 *       Filename:  block.h
 *
 *    Description:  
 *
 *        Version:  1.0
 *        Created:  2025/03/18 23时12分40秒
 *       Revision:  none
 *       Compiler:  gcc
 *
 *         Author:  zhuzonghui(puchuchen@outlook.com) (), 
 *   Organization:  
 *
 * =====================================================================================
 */
#include<fuquOS/type.h>

#define ATA_PRIMARY_IO 0x1F0 // 主通道数据端口
#define ATA_PRIMARY_STATUS 0x1F7 // 状态端口
#define ATA_PRIMARY_CONTROL 0x3F6 // 控制端口
#define ATA_COMMAND_READ 0x20 // 读取扇区指令
#define ATA_COMMAND_IDENTIFY 0xEC

#define ATA_SR_BSY 0x80 // 硬盘忙
#define ATA_SR_DRQ 0x08 // 数据请求

typedef struct{
    u8 boot_flag;
    u8 chs_start[3];
    u8 type;
    u8 chs_end[3];
    u32 lba_start;
    u32 sectors;
} PartitionEntry;

typedef struct{
    u8 bootloader[446];
    PartitionEntry partitions[4];
    u16 signature;
} __attribute__((packed)) MBR;

extern u64 disk_size;
extern MBR *mbr;

int ata_identify();
// 解析字符串(ATA返回的是字节反转的)
void ata_string_fix(u16 *src,char *dst,int len);
// 解析IDENTIFY
void ata_parse_identify();
// 查看磁盘扇区大小
void ata_check_sector_size();
// 查看磁盘的控制器模式
void ata_check_pio_dma();
// 查看分区信息
void read_mbr();
// 读取一个扇区到buffer中
int ata_read_sector(u32 lba,void *buffer);
void block_init();

// 读取4096B的硬盘内容到内存中
void read_disk(u32 lba,u16 *buffer);
// 写入4096B的内存内容到硬盘中
void write_disk(u32 lba,u16 *buffer);